<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
"http://www.w3.org/TR/html4/strict.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>MeCab の辞書構造と汎用テキスト変換ツールとしての利用</title>
<link type="text/css" rel="stylesheet" href="mecab.css">
</head>
<body>
<h1>MeCab の辞書構造と汎用テキスト変換ツールとしての利用</h1>

<h2>概要</h2>
<p>単語辞書の構造を理解することで, MeCab を汎用的なテキスト変換ツールとして利用することができます. 例えば, 
ひらがな to カタカナ変換, ローマ字 to ひらがな変換, Auto Link等を MeCab だけで実行できます
</p>

<h2>ファイル</h2>
<p>
単語辞書を構築するには, 最低以下のファイルを作成する必要があります. 
</p>

<ul>
<li>*.csv ファイル (単語辞書)
<li>matrix.def (連接表)
<li>unk.def (未知語用品詞定義)
<li>char.def (未知語の文字定義)
<li>dicrc (設定ファイル)
</ul>

<h3>*.csv ファイル</h3>
<p>単語辞書です</p>

<p>エントリは, 以下のような CSV で追加します.</p>

<pre>
test,1223,1223,6058,foo,bar,baz
</pre>

<p>最初の4つは必須エントリで, それぞれ</p>
<ul>
<li>表層形
<li>左文脈ID (単語を左から見たときの文脈 ID)
<li>右文脈ID (単語を右から見たときの文脈 ID)
<li>単語コスト (小さいほど出現しやすい)
</ul>
<p>となっています. コスト値は short int (16bit 整数)
の範囲におさめる必要があります. </p>

<p>
5カラム目以降は, ユーザ定義の CSV フィールドです. 基本的に
どんな内容でも CSV の許す限り追加することができます. 
</p>

<h3>matrix.def</h3>
<p>最初の行に連接表のサイズ(前件サイズ, 後件サイズ)を書きます. その後は, 
連接表の前件の文脈 ID, 後件の文脈IDと, それに対応するコストを書きます. 
</p>
<p>ある単語 A, B が連接をなすとき, </p>
<ul>
<li>前件文脈ID = 単語Aの右文脈ID 
<li>後件文脈ID = 単語Bの左文脈ID
</ul>

<p>となります. つまり, 単語辞書に登録した ID が連接表を参照する際の
キーとなります. コスト値は short int (16bit 整数)
の範囲におさめる必要があります. </p>

<pre>
100 120
0 0 1
0 1 10
0 2 5
</pre>

<p>上記の例では, 前件の文脈のサイズが100, 後件の文脈のサイズが 120 となって
います. また, 前件文脈 0 から 後件文脈 1 への遷移コストが 10 となっています. 
</p>

<h3>char.def</h3>
<p>未知語処理のルールです. <a href="learn.html">こちら</a>を御覧ください.
</p>

<p>以下が最低限の設定 (DEFAULT と SPACE) です</p>
<pre>
DEFAULT 1 0 0
SPACE   0 1 0
0x0020 SPACE
</pre>

<h3>unk.def</h3>
<p>未知語に対する品詞列のテーブルです. <a href="learn.html">こちら</a>を
御覧ください. </p>

<p>以下が最低限の設定 (DEFAULT と SPACE) です</p>
<pre>
DEFAULT,0,0,0,*
SPACE,0,0,0,*
</pre>


<h2>辞書のコンパイル</h2>
<p>次のコマンドを実行することで, 解析用のバイナリ辞書を作成します. </p>
<pre>
% /usr/local/libexec/mecab/mecab-dict-index 
</pre>

</p>

<h2>ケーススタディ</h2>
<p>example ディレクトリにいくつかの応用例があります.</p>

<h3>Auto Link</h3>
<p>Hatena Keyword のような Auto Link を実装してみます</p>
<ul>
<li>url.csv
<p>単語としてキーワード, 品詞としてキーワードに対応する URL を書きます.
連接の状態は1状態で十分なので, 左文脈/右文脈IDともに 0 とします. 
コスト値は長いキーワードが優先されるよう設定します. 例えば以下のような関数を使うとよいでしょう.</p>
<pre>cost = (int)max(-36000, -400 * (length^1.5)) </pre>

url.csv
<pre>
Google,0,0,-5878,http://www.google.com/
Yahoo,0,0,-4472,http://www.yahoo.com/
ChaSen,0,0,-5878,http://chasen.org/
京都,0,0,-3200,http://www.city.kyoto.jp/
...
</pre>

<li>matrix.def
<p>1 状態なので, 連接表のサイズは 1 x 1 となります. 
後件 0 から前件 0 の連接コストは 0 とします.</p>
<pre>
1 1
0 0 0
</pre>

<li>char.def
<p>最低限の設定 (DEFAULT と SPACE) です</p>
<pre>
DEFAULT 1 0 0
SPACE   0 1 0
0x0020 SPACE
</pre>

<li>unk.def
<p>最低限の設定 (DEFAULT と SPACE) です</p>
<pre>
DEFAULT,0,0,0,*
SPACE,0,0,0,*
</pre>

<li>dicrc
<p>autolink というフォーマットを作成し, それがデフォルトの出力になるようにします</p>
<pre>
cost-factor = 800
bos-feature = BOS/EOS
output-format-type=autolink

node-format-autolink = &lt;a href="%H"&gt;%M&lt;/a&gt;
unk-format-autolink = %M
eos-format-autolink = \n
</pre>

<li>コンパイル + テスト
<pre>
% /usr/local/libexec/mecab/mecab-dict-index -f euc-jp -c euc-jp
reading ./unk.def ..  2
emitting double-array: 100% |###########################################| 
reading ./dic.csv ..  4
emitting double-array: 100% |###########################################| 
emitting matrix      : 100% |###########################################
done!

% mecab -d .
京都に行った. 
&lt;a href="http://www.city.kyoto.jp/"&gt;京都&lt;/a&gt;に行った。
YahooとGoogle
&lt;a href="http://www.yahoo.com/"&gt;Yahoo&lt;/a&gt;と&lt;a href="http://www.google.com/"&gt;Google&lt;/a&gt;
</pre>
</ul>

<h3>ひらがな to カタカナ変換ツール</h3>
<ul>
<li>dic.csv
<p>単語としてひらがな1文字, 品詞として各ひらがな対応するカタカナ1文字を書きます.
連接の状態は1状態で十分なので, 左文脈/右文脈IDともに 0 とします. 
曖昧性がないため コスト値は 0 とします</p>
<pre>
う゛,0,0,0,ヴ
あ,0,0,0,ア
い,0,0,0,イ
う,0,0,0,ウ
え,0,0,0,エ
お,0,0,0,オ
ぁ,0,0,0,ァ
ぃ,0,0,0,ィ
ぅ,0,0,0,ゥ
ぇ,0,0,0,ェ
ぉ,0,0,0,ォ
か,0,0,0,カ
き,0,0,0,キ
く,0,0,0,ク
け,0,0,0,ケ
こ,0,0,0,コ
が,0,0,0,ガ
ぎ,0,0,0,ギ
ぐ,0,0,0,グ
げ,0,0,0,ゲ
ご,0,0,0,ゴ
さ,0,0,0,サ
し,0,0,0,シ
す,0,0,0,ス
せ,0,0,0,セ
そ,0,0,0,ソ
ざ,0,0,0,ザ
じ,0,0,0,ジ
ず,0,0,0,ズ
ぜ,0,0,0,ゼ
ぞ,0,0,0,ゾ
た,0,0,0,タ
ち,0,0,0,チ
つ,0,0,0,ツ
て,0,0,0,テ
と,0,0,0,ト
だ,0,0,0,ダ
ぢ,0,0,0,ヂ
づ,0,0,0,ヅ
で,0,0,0,デ
ど,0,0,0,ド
っ,0,0,0,ッ
な,0,0,0,ナ
に,0,0,0,ニ
ぬ,0,0,0,ヌ
ね,0,0,0,ネ
の,0,0,0,ノ
は,0,0,0,ハ
ひ,0,0,0,ヒ
ふ,0,0,0,フ
へ,0,0,0,ヘ
ほ,0,0,0,ホ
ば,0,0,0,バ
び,0,0,0,ビ
ぶ,0,0,0,ブ
べ,0,0,0,ベ
ぼ,0,0,0,ボ
ぱ,0,0,0,パ
ぴ,0,0,0,ピ
ぷ,0,0,0,プ
ぺ,0,0,0,ペ
ぽ,0,0,0,ポ
ま,0,0,0,マ
み,0,0,0,ミ
む,0,0,0,ム
め,0,0,0,メ
も,0,0,0,モ
ゃ,0,0,0,ャ
や,0,0,0,ヤ
ゅ,0,0,0,ュ
ゆ,0,0,0,ユ
ょ,0,0,0,ョ
よ,0,0,0,ヨ
ら,0,0,0,ラ
り,0,0,0,リ
る,0,0,0,ル
れ,0,0,0,レ
ろ,0,0,0,ロ
ゎ,0,0,0,ヮ
わ,0,0,0,ワ
ゐ,0,0,0,ヰ
ゑ,0,0,0,ヱ
を,0,0,0,ヲ
ん,0,0,0,ン
</pre>

<li>matrix.def
<p>1 状態なので, 連接表のサイズは 1 x 1 となります. 
後件 0 から前件 0 の連接コストは 0 とします.</p>
<pre>
1 1
0 0 0
</pre>

<li>char.def
<p>最低限の設定 (DEFAULT と SPACE) です</p>
<pre>
DEFAULT 1 0 0
SPACE   0 1 0
0x0020 SPACE
</pre>

<li>unk.def
<p>最低限の設定 (DEFAULT と SPACE) です</p>
<pre>
DEFAULT,0,0,0,*
SPACE,0,0,0,*
</pre>

<li>dicrc
<p>katakana というフォーマットを作成し, それがデフォルトの出力になるよう
    にします</p>
<pre>
dictionary-charset = euc-jp
cost-factor = 800
bos-feature = BOS/EOS
output-format-type=katakana

node-format-katakana = %H
unk-format-katakana = %M
eos-format-katakana  = \n
</pre>

<li>コンパイル + テスト
<pre>
% /usr/local/libexec/mecab/mecab-dict-index -f euc-jp -c euc-jp
reading ./unk.def ..  2
emitting double-array: 100% |###########################################| 
reading ./dic.csv ..  4
emitting double-array: 100% |###########################################| 
emitting matrix      : 100% |###########################################
done!
% mecab -d .
これはてすとです
コレハテストデス
</pre>
</ul>
</body>
</html>

